A function to connect to a bigip device and start a new transaction.

    hostname
        The host/address of the bigip device
    username
        The iControl REST username
    password
        The iControl REST password
    label
        The name / alias for this transaction.  The actual transaction
        id will be stored within a grain called ``bigip_f5_trans:<label>``

    CLI Example::

        salt '*' bigip.start_transaction bigip admin admin my_transaction

def start_transaction(hostname, username, password, label):
    '''
    A function to connect to a bigip device and start a new transaction.

    hostname
        The host/address of the bigip device
    username
        The iControl REST username
    password
        The iControl REST password
    label
        The name / alias for this transaction.  The actual transaction
        id will be stored within a grain called ``bigip_f5_trans:<label>``

    CLI Example::

        salt '*' bigip.start_transaction bigip admin admin my_transaction

    '''

    #build the session
    bigip_session = _build_session(username, password)

    payload = {}

    #post to REST to get trans id
    try:
        response = bigip_session.post(
            BIG_IP_URL_BASE.format(host=hostname) + '/transaction',
            data=salt.utils.json.dumps(payload)
        )
    except requests.exceptions.ConnectionError as e:
        return _load_connection_error(hostname, e)

    #extract the trans_id
    data = _load_response(response)

    if data['code'] == 200:

        trans_id = data['content']['transId']

        __salt__['grains.setval']('bigip_f5_trans', {label: trans_id})

        return 'Transaction: {trans_id} - has successfully been stored in the grain: bigip_f5_trans:{label}'.format(trans_id=trans_id,
                                                                                                                       label=label)
    else:
        return data