<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def create_or_update_role(self, name, credential_type, policy_document=None, default_sts_ttl=None, max_sts_ttl=None, role_arns=None, policy_arns=None, legacy_params=False, mount_point=DEFAULT_MOUNT_POINT):
 """Create or update the role with the given name. If a role with the name does not exist, it will be created. If the role exists, it will be updated with the new attributes. Supported methods: POST: /{mount_point}/roles/{name}. Produces: 204 (empty body) :param name: Specifies the name of the role to create. This is part of the request URL. :type name: str | unicode :param credential_type: Specifies the type of credential to be used when retrieving credentials from the role. Must be one of iam_user, assumed_role, or federation_token. :type credential_type: str | unicode :param policy_document: The IAM policy document for the role. The behavior depends on the credential type. With iam_user, the policy document will be attached to the IAM user generated and augment the permissions the IAM user has. With assumed_role and federation_token, the policy document will act as a filter on what the credentials can do. :type policy_document: dict | str | unicode :param default_sts_ttl: The default TTL for STS credentials. When a TTL is not specified when STS credentials are requested, and a default TTL is specified on the role, then this default TTL will be used. Valid only when credential_type is one of assumed_role or federation_token. :type default_sts_ttl: str | unicode :param max_sts_ttl: The max allowed TTL for STS credentials (credentials TTL are capped to max_sts_ttl). Valid only when credential_type is one of assumed_role or federation_token. :type max_sts_ttl: str | unicode :param role_arns: Specifies the ARNs of the AWS roles this Vault role is allowed to assume. Required when credential_type is assumed_role and prohibited otherwise. This is a comma-separated string or JSON array. String types supported for Vault legacy parameters. :type role_arns: list | str | unicode :param policy_arns: Specifies the ARNs of the AWS managed policies to be attached to IAM users when they are requested. Valid only when credential_type is iam_user. When credential_type is iam_user, at least one of policy_arns or policy_document must be specified. This is a comma-separated string or JSON array. :type policy_arns: list :param legacy_params: Flag to send legacy (Vault versions < 0.11.0) parameters in the request. When this is set to True, policy_document and policy_arns are the only parameters used from this method. :type legacy_params: bool :param mount_point: The "path" the method/backend was mounted on. :type mount_point: str | unicode :return: The response of the request. :rtype: requests.Response """

        if credential_type not in ALLOWED_CREDS_TYPES:
            error_msg = 'invalid credential_type argument provided "{arg}", supported types: "{allowed_types}"'
            raise exceptions.ParamValidationError(error_msg.format(
                arg=credential_type,
                allowed_types=', '.join(ALLOWED_CREDS_TYPES),
            ))
        if isinstance(policy_document, dict):
            policy_document = json.dumps(policy_document, indent=4, sort_keys=True)

        if legacy_params:
            # Support for Vault <0.11.0
            params = {
                'policy': policy_document,
                'arn': policy_arns[0] if isinstance(policy_arns, list) else policy_arns,
            }
        else:
            params = {
                'credential_type': credential_type,
                'policy_document': policy_document,
                'default_sts_ttl': default_sts_ttl,
                'max_sts_ttl': max_sts_ttl,
                'role_arns': role_arns,
                'policy_arns': policy_arns,
            }
        api_path = '/v1/{mount_point}/roles/{name}'.format(
            mount_point=mount_point,
            name=name,
        )
        return self._adapter.post(
            url=api_path,
            json=params,
        )