<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

def describe(vpc_id=None, vpc_name=None, region=None, key=None,
             keyid=None, profile=None):
    '''
    Given a VPC ID describe its properties.

    Returns a dictionary of interesting properties.

    .. versionchanged:: 2015.8.0
        Added vpc_name argument

    CLI Example:

    .. code-block:: bash

        salt myminion boto_vpc.describe vpc_id=vpc-123456
        salt myminion boto_vpc.describe vpc_name=myvpc

    '''

    if not any((vpc_id, vpc_name)):
        raise SaltInvocationError('A valid vpc id or name needs to be specified.')

    try:
        conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)
        vpc_id = check_vpc(vpc_id, vpc_name, region, key, keyid, profile)
    except BotoServerError as err:
        boto_err = __utils__['boto.get_error'](err)
        if boto_err.get('aws', {}).get('code') == 'InvalidVpcID.NotFound':
            # VPC was not found: handle the error and return None.
            return {'vpc': None}
        return {'error': boto_err}

    if not vpc_id:
        return {'vpc': None}

    filter_parameters = {'vpc_ids': vpc_id}

    try:
        vpcs = conn.get_all_vpcs(**filter_parameters)
    except BotoServerError as err:
        return {'error': __utils__['boto.get_error'](err)}

    if vpcs:
        vpc = vpcs[0]  # Found!
        log.debug('Found VPC: %s', vpc.id)

        keys = ('id', 'cidr_block', 'is_default', 'state', 'tags',
                'dhcp_options_id', 'instance_tenancy')
        _r = dict([(k, getattr(vpc, k)) for k in keys])
        _r.update({'region': getattr(vpc, 'region').name})
        return {'vpc': _r}
    else:
        return {'vpc': None}