Пример #1
0
def loadProperties(cfg_file, extra_props):
    props = Properties()
    iterated_props = Properties()
    inherited_props = Properties()

    data_linage = Properties()

    global_reg = global_platform.load_global_registry()
    site_home = global_reg.getProperty('site.home')
    global_properties = global_reg.getProperty('global.properties')

    if global_properties:
        if site_home:
            baseFile = getBaseFile(global_properties, site_home)
            if baseFile == '':
                log.error('Global properties file does not exist: ' +
                          global_properties)
                log.info(
                    'Suggested Fix: Update the global_platform.properties property within global.properties to the correct file path'
                )
                sys.exit()
            global_properties = baseFile
        log.info('Loading global configuration from file: ' +
                 global_properties)
        addPropertiesFromFile(props, global_properties, site_home)

    if cfg_file:
        addPropertiesFromFile(props, cfg_file, site_home)

    if extra_props:
        props.putAll(extra_props)

# resolve property level inheritance and iterations
    log.debug('Attempting to resolve property level inheritance')
    enum = props.keys()
    while enum.hasMoreElements():
        key = enum.nextElement()
        value = props.getProperty(key)
        # Check for property level inheritance
        if re.search(r"\.base$", key) is not None:
            prop_to_inherit = value
            prop_to_extend = key[:-5]
            log.debug('Inheriting the properties from the ' + prop_to_inherit +
                      ' section in to the section ' + prop_to_extend)
            # Iterate the properties again looking for a match on properties to inherit
            enum_inner = props.keys()
            while enum_inner.hasMoreElements():
                key_inner = enum_inner.nextElement()
                value_inner = props.getProperty(key_inner)
                log.debug('Checking key_inner [' + key_inner + '] matches ' +
                          prop_to_inherit)
                if String.startsWith(String(key_inner),
                                     String(prop_to_inherit)):
                    new_property = prop_to_extend + String.substring(
                        key_inner, len(prop_to_inherit))
                    # Don't override the property if it has already been defined earlier
                    if props.getProperty(new_property) is None:
                        log.debug('Setting inherited property ' +
                                  new_property + ' to value ' + value_inner)
                        inherited_props.setProperty(new_property, value_inner)
                        addDataLinage(key, cfg_file, value_inner)
            # Remove the key that defines the base, just keeps us consistant with the template behaviours
            log.debug("About to remove key " + key)
            props.remove(key)

    props.putAll(inherited_props)

    log.debug('Attempting to resolve iterations')
    enum = props.keys()
    while enum.hasMoreElements():
        key = enum.nextElement()
        value = props.getProperty(key)
        # Check for property set iterations
        if re.search(r"\.iterate$", key) is not None:
            iteration_key = key
            iteration_set = eval(value)
            prop_to_iterate = key[:-9]
            log.debug('Iterating the properties from the ' + prop_to_iterate +
                      ' section')
            # Iterate the properties again looking for a match on properties to iterate
            enum_inner = props.keys()
            while enum_inner.hasMoreElements():
                key_inner = enum_inner.nextElement()
                value_inner = props.getProperty(key_inner)
                # if the string is part of the set but not the actual iterator then we will check it
                if String.startsWith(String(key_inner), String(
                        prop_to_iterate)) and key_inner != iteration_key:
                    log.debug('Checking if the key [' + key_inner +
                              '] or value = ' + value_inner +
                              ' contains an iterator ')
                    contains_iterator = 0
                    iterated_key = String(key_inner)
                    iterated_value = String(value_inner)

                    if String.indexOf(String(key_inner), "%") > -1:
                        log.debug(key_inner +
                                  ' contains an iterator, replacing it')
                        contains_iterator = 1

                    if String.indexOf(String(value_inner), "%") > -1:
                        log.debug(value_inner +
                                  ' contains an iterator, replacing it')
                        contains_iterator = 1

                    for i in iteration_set:
                        iterated_key = String.replaceAll(
                            String(key_inner), "\%", str(i))
                        iterated_value = String.replaceAll(
                            String(value_inner), "\%", str(i))

                        # Don't override the property if it has already been defined earlier
                        if props.getProperty(iterated_key) is None:
                            log.debug('Setting iterated property ' +
                                      iterated_key + ' to value ' +
                                      iterated_value)
                            iterated_props.setProperty(iterated_key,
                                                       iterated_value)
                            addDataLinage(key, cfg_file, iterated_value)

                    # Remove the key that gets iterated, just keeps us consistant with the template behaviours
                    if (contains_iterator == 1):
                        log.debug('About to remove ' + key_inner)
                        props.remove(key_inner)

            # Remove the key that defines the iterations, just keeps us consistant with the template behaviours
            props.remove(iteration_key)

# Add the iterated properties back in to the main set
    props.putAll(iterated_props)

    # resolve embedded references
    enum = props.keys()
    while enum.hasMoreElements():
        key = enum.nextElement()
        value = props.getProperty(key)
        if not value is None and len(value) > 0:
            if re.search(r"\$\{(.*?)\}", value) is not None:
                resolvedValue = resolveProperty(key, props)
                if resolvedValue is None:
                    raise Exception('unable to resolve property: ' + key +
                                    '=' + value)
                else:
                    props.setProperty(key, resolvedValue)
                    addDataLinage(key, cfg_file, resolvedValue)

    # remove any properties that start with base (assumed that these are baseline properties that have been inherited
    enum = props.keys()
    while enum.hasMoreElements():
        key = enum.nextElement()
        if String.startsWith(String(key), 'base.'):
            props.remove(key)

    decryptAllPasswords(cfg_file, props)

    return props
def loadProperties(cfg_file, extra_props):
    props = Properties()
    iterated_props = Properties()
    inherited_props = Properties()
    
    data_linage = Properties()
	
    redback_reg = redback.load_redback_registry() 
    site_home = redback_reg.getProperty('site.home') 
    global_properties = redback_reg.getProperty('global.properties')

    if global_properties:
        if site_home:
            baseFile=getBaseFile(global_properties, site_home)
            if baseFile=='':
                log.error('Global properties file does not exist: ' + global_properties)
                log.info('Suggested Fix: Update the global.properties property within redback.properties to the correct file path')
                sys.exit()
            global_properties=baseFile
        log.info('Loading global configuration from file: ' + global_properties)
        addPropertiesFromFile(props, global_properties, site_home)
    
    if cfg_file:
        addPropertiesFromFile(props, cfg_file, site_home)
    
    if extra_props:
        props.putAll(extra_props)
		
	# resolve property level inheritance and iterations
    log.debug('Attempting to resolve property level inheritance')
    enum = props.keys()
    while enum.hasMoreElements():
        key = enum.nextElement()
        value = props.getProperty(key)
        # Check for property level inheritance
        if re.search(r"\.base$", key) is not None:				
            prop_to_inherit = value
            prop_to_extend = key[:-5]
            log.debug('Inheriting the properties from the ' + prop_to_inherit + ' section in to the section ' + prop_to_extend)
            # Iterate the properties again looking for a match on properties to inherit
            enum_inner = props.keys()
            while enum_inner.hasMoreElements():
                key_inner = enum_inner.nextElement()
                value_inner = props.getProperty(key_inner)
                log.debug('Checking key_inner [' + key_inner + '] matches ' + prop_to_inherit)
                if String.startsWith(String(key_inner),String(prop_to_inherit)):
                    new_property = prop_to_extend + String.substring(key_inner, len(prop_to_inherit))					
                    # Don't override the property if it has already been defined earlier
                    if props.getProperty(new_property) is None:
                        log.debug('Setting inherited property ' + new_property + ' to value ' + value_inner)
                        inherited_props.setProperty(new_property, value_inner)
                        addDataLinage(key,cfg_file,value_inner)
            # Remove the key that defines the base, just keeps us consistant with the template behaviours
            log.debug("About to remove key " + key)
            props.remove(key)
                        
    props.putAll(inherited_props)
    
    log.debug('Attempting to resolve iterations')
    enum = props.keys()
    while enum.hasMoreElements():			
        key = enum.nextElement()
        value = props.getProperty(key)				
        # Check for property set iterations
        if re.search(r"\.iterate$", key) is not None:
            iteration_key = key            
            iteration_set = eval(value)
            prop_to_iterate = key[:-9]
            log.debug('Iterating the properties from the ' + prop_to_iterate + ' section')
            # Iterate the properties again looking for a match on properties to iterate
            enum_inner = props.keys()
            while enum_inner.hasMoreElements():
                key_inner = enum_inner.nextElement()
                value_inner = props.getProperty(key_inner)
                # if the string is part of the set but not the actual iterator then we will check it
                if String.startsWith(String(key_inner),String(prop_to_iterate)) and key_inner != iteration_key:
                    log.debug('Checking if the key [' + key_inner + '] or value = ' + value_inner + ' contains an iterator ')
                    contains_iterator = 0
                    iterated_key = String(key_inner)
                    iterated_value = String(value_inner)
					
                    if String.indexOf(String(key_inner),"%") > -1:
                        log.debug(key_inner + ' contains an iterator, replacing it')						
                        contains_iterator = 1

                    if String.indexOf(String(value_inner),"%") > -1:
                        log.debug(value_inner + ' contains an iterator, replacing it')	
                        contains_iterator = 1											
					                                       
                    for i in iteration_set:
                        iterated_key = String.replaceAll(String(key_inner),"\%",str(i))
                        iterated_value = String.replaceAll(String(value_inner),"\%",str(i))	
						
                        # Don't override the property if it has already been defined earlier
                        if props.getProperty(iterated_key) is None:
                            log.debug('Setting iterated property ' + iterated_key + ' to value ' + iterated_value)
                            iterated_props.setProperty(iterated_key, iterated_value)
                            addDataLinage(key,cfg_file,iterated_value)
					
                    # Remove the key that gets iterated, just keeps us consistant with the template behaviours
                    if (contains_iterator == 1):
                        log.debug('About to remove ' + key_inner)
                        props.remove(key_inner)
                        
            # Remove the key that defines the iterations, just keeps us consistant with the template behaviours
            props.remove(iteration_key)
	
	# Add the iterated properties back in to the main set    
    props.putAll(iterated_props)
	
    # resolve embedded references
    enum = props.keys()
    while enum.hasMoreElements():
        key = enum.nextElement()
        value = props.getProperty(key)
        if not value is None and len(value) > 0:
            if re.search(r"\$\{(.*?)\}", value) is not None:
                resolvedValue = resolveProperty(key, props)
                if resolvedValue is None:
                    raise Exception('unable to resolve property: ' + key + '=' + value)
                else:
                    props.setProperty(key, resolvedValue)
                    addDataLinage(key,cfg_file,resolvedValue)   
    
    # remove any properties that start with base (assumed that these are baseline properties that have been inherited
    enum = props.keys()
    while enum.hasMoreElements():
        key = enum.nextElement()
        if String.startsWith(String(key),'base.'):
            props.remove(key)
    
    decryptAllPasswords(cfg_file,props)

    return props