Skip to content
Snippets Groups Projects
identifier.py 2.14 KiB
Newer Older
  • Learn to ignore specific revisions
  • Gordon Chung's avatar
    Gordon Chung committed
    # Copyright 2013 IBM Corp.
    #
    
    Dolph Mathews's avatar
    Dolph Mathews committed
    # Licensed under the Apache License, Version 2.0 (the "License"); you may not
    # use this file except in compliance with the License. You may obtain a copy of
    # the License at
    
    Gordon Chung's avatar
    Gordon Chung committed
    #
    
    Dolph Mathews's avatar
    Dolph Mathews committed
    #     http://www.apache.org/licenses/LICENSE-2.0
    
    Gordon Chung's avatar
    Gordon Chung committed
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
    # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    
    Dolph Mathews's avatar
    Dolph Mathews committed
    # License for the specific language governing permissions and limitations under
    # the License.
    
    import hashlib
    
    Gordon Chung's avatar
    Gordon Chung committed
    import uuid
    
    gordon chung's avatar
    gordon chung committed
    import warnings
    
    Gordon Chung's avatar
    Gordon Chung committed
    
    
    Steve Martinelli's avatar
    Steve Martinelli committed
    from oslo_config import cfg
    
    
    CONF = cfg.CONF
    opts = [
        cfg.StrOpt('namespace',
                   default='openstack',
                   help='namespace prefix for generated id'),
    ]
    CONF.register_opts(opts, group='audit')
    
    Gordon Chung's avatar
    Gordon Chung committed
    
    
    
    AUDIT_NS = None
    if CONF.audit.namespace:
    
        sha256_hash = hashlib.sha256(CONF.audit.namespace.encode('utf-8'))
        AUDIT_NS = uuid.UUID(sha256_hash.hexdigest()[0:32])
    
    VALID_EXCEPTIONS = ['default', 'initiator', 'observer', 'target']
    
    
    Gordon Chung's avatar
    Gordon Chung committed
    def generate_uuid():
    
    Dolph Mathews's avatar
    Dolph Mathews committed
        """Generate a CADF identifier."""
    
        if AUDIT_NS:
            return str(uuid.uuid5(AUDIT_NS, str(uuid.uuid4())))
        return str(uuid.uuid4())
    
    def _check_valid_uuid(value):
        """Checks a value for one or multiple valid uuids joined together."""
    
        if not value:
            raise ValueError
    
        value = re.sub('[{}-]|urn:uuid:', '', value)
        for val in [value[i:i + 32] for i in range(0, len(value), 32)]:
            uuid.UUID(val)
    
    
    
    Gordon Chung's avatar
    Gordon Chung committed
    def is_valid(value):
    
        """Validation to ensure Identifier is correct.
    
        If the Identifier value is a string type but not a valid UUID string,
        warn against interoperability issues and return True. This relaxes
        the requirement of having strict UUID checking.
        """
        if value in VALID_EXCEPTIONS:
    
            return True
        try:
    
            _check_valid_uuid(value)
    
    gordon chung's avatar
    gordon chung committed
        except (ValueError, TypeError):
    
    Takashi Kajinami's avatar
    Takashi Kajinami committed
            if not isinstance(value, str) or not value:
    
    gordon chung's avatar
    gordon chung committed
                return False
    
            warnings.warn(('Invalid uuid: %s. To ensure interoperability, '
                          'identifiers should be a valid uuid.' % (value)))
    
    gordon chung's avatar
    gordon chung committed
        return True