def update_usage_plan(plan_id, throttle=None, quota=None, region=None, key=None, keyid=None, profile=None):
    '''
    Updates an existing usage plan with throttling and quotas

    .. versionadded:: 2017.7.0

    plan_id
        Id of the created usage plan

    throttle
        A dictionary consisting of the following keys:

        rateLimit
            requests per second at steady rate, float

        burstLimit
            maximum number of requests per second, integer

    quota
        A dictionary consisting of the following keys:

        limit
            number of allowed requests per specified quota period [required if quota parameter is present]

        offset
            number of requests to be subtracted from limit at the beginning of the period [optional]

        period
            quota period, must be one of DAY, WEEK, or MONTH. [required if quota parameter is present

    CLI Example:

    .. code-block:: bash

        salt myminion boto_apigateway.update_usage_plan plan_id='usage plan id' throttle='{"rateLimit": 10.0, "burstLimit": 10}'

    '''
    try:
        _validate_throttle(throttle)
        _validate_quota(quota)

        conn = _get_conn(region=region, key=key, keyid=keyid, profile=profile)

        patchOperations = []

        if throttle is None:
            patchOperations.append({'op': 'remove', 'path': '/throttle'})
        else:
            if 'rateLimit' in throttle:
                patchOperations.append({'op': 'replace', 'path': '/throttle/rateLimit', 'value': str(throttle['rateLimit'])})  # future lint: disable=blacklisted-function
            if 'burstLimit' in throttle:
                patchOperations.append({'op': 'replace', 'path': '/throttle/burstLimit', 'value': str(throttle['burstLimit'])})  # future lint: disable=blacklisted-function

        if quota is None:
            patchOperations.append({'op': 'remove', 'path': '/quota'})
        else:
            patchOperations.append({'op': 'replace', 'path': '/quota/period', 'value': str(quota['period'])})  # future lint: disable=blacklisted-function
            patchOperations.append({'op': 'replace', 'path': '/quota/limit', 'value': str(quota['limit'])})  # future lint: disable=blacklisted-function
            if 'offset' in quota:
                patchOperations.append({'op': 'replace', 'path': '/quota/offset', 'value': str(quota['offset'])})  # future lint: disable=blacklisted-function

        if patchOperations:
            res = conn.update_usage_plan(usagePlanId=plan_id,
                                         patchOperations=patchOperations)
            return {'updated': True, 'result': res}

        return {'updated': False}

    except ClientError as e:
        return {'error': __utils__['boto3.get_error'](e)}
    except (TypeError, ValueError) as e:
        return {'error': six.text_type(e)}
Updates an existing usage plan with throttling and quotas

    .. versionadded:: 2017.7.0

    plan_id
        Id of the created usage plan

    throttle
        A dictionary consisting of the following keys:

        rateLimit
            requests per second at steady rate, float

        burstLimit
            maximum number of requests per second, integer

    quota
        A dictionary consisting of the following keys:

        limit
            number of allowed requests per specified quota period [required if quota parameter is present]

        offset
            number of requests to be subtracted from limit at the beginning of the period [optional]

        period
            quota period, must be one of DAY, WEEK, or MONTH. [required if quota parameter is present

    CLI Example:

    .. code-block:: bash

        salt myminion boto_apigateway.update_usage_plan plan_id='usage plan id' throttle='{"rateLimit": 10.0, "burstLimit": 10}'