code: def create_or_update_secret(self, path, secret, cas=None, mount_point=DEFAULT_MOUNT_POINT):
          
          params = {
              'options': {},
              'data': secret,
          }
  
          if cas is not None:
              params['options']['cas'] = cas
  
          api_path = '/v1/{mount_point}/data/{path}'.format(mount_point=mount_point, path=path)
          response = self._adapter.post(
              url=api_path,
              json=params,
          )
          return response.json()
docs: Create a new version of a secret at the specified location.
  
          If the value does not yet exist, the calling token must have an ACL policy granting the create capability. If
          the value already exists, the calling token must have an ACL policy granting the update capability.
  
          Supported methods:
              POST: /{mount_point}/data/{path}. Produces: 200 application/json
  
          :param path: Path
          :type path: str | unicode
          :param cas: Set the "cas" value to use a Check-And-Set operation. If not set the write will be allowed. If set
              to 0 a write will only be allowed if the key doesn't exist. If the index is non-zero the write will only be
              allowed if the key's current version matches the version specified in the cas parameter.
          :type cas: int
          :param secret: The contents of the "secret" dict will be stored and returned on read.
          :type secret: dict
          :param mount_point: The "path" the secret engine was mounted on.
          :type mount_point: str | unicode
          :return: The JSON response of the request.
          :rtype: dict