diff --git a/doc/radosgw/admin.rst b/doc/radosgw/admin.rst index 42e3d97bd44b8..4f172eab4aa10 100644 --- a/doc/radosgw/admin.rst +++ b/doc/radosgw/admin.rst @@ -415,6 +415,7 @@ the latest quota stats. :: radosgw-admin user stats --uid= --sync-stats +.. _rgw_user_usage_stats: Get User Usage Stats -------------------- diff --git a/doc/radosgw/s3/serviceops.rst b/doc/radosgw/s3/serviceops.rst index c55ce988bd157..54b6ca375113a 100644 --- a/doc/radosgw/s3/serviceops.rst +++ b/doc/radosgw/s3/serviceops.rst @@ -37,3 +37,33 @@ Response Entities +----------------------------+-------------+-----------------------------------------------------------------+ | ``DisplayName`` | String | The bucket owner's display name. | +----------------------------+-------------+-----------------------------------------------------------------+ + + +Get Usage Stats +--------------- + +Gets usage stats per user, similar to the admin command :ref:`rgw_user_usage_stats`. + +Syntax +~~~~~~ +:: + + GET /?usage HTTP/1.1 + Host: cname.domain.com + + Authorization: AWS {access-key}:{hash-of-header-and-secret} + +Response Entities +~~~~~~~~~~~~~~~~~ + ++----------------------------+-------------+-----------------------------------------------------------------+ +| Name | Type | Description | ++============================+=============+=================================================================+ +| ``Summary`` | Container | Summary of total stats by user. | ++----------------------------+-------------+-----------------------------------------------------------------+ +| ``TotalBytes`` | Integer | Bytes used by user | ++----------------------------+-------------+-----------------------------------------------------------------+ +| ``TotalBytesRounded`` | Integer | Bytes rounded to the nearest 4k boundary | ++----------------------------+-------------+-----------------------------------------------------------------+ +| ``TotalEntries`` | Integer | Total object entries | ++----------------------------+-------------+-----------------------------------------------------------------+ diff --git a/examples/boto3/append_object.py b/examples/boto3/append_object.py new file mode 100755 index 0000000000000..0e13252ec3f48 --- /dev/null +++ b/examples/boto3/append_object.py @@ -0,0 +1,42 @@ +#!/usr/bin/python +from __future__ import print_function + +import boto3 +import sys +import json + +def js_print(arg): + print(json.dumps(arg, indent=2)) + +if len(sys.argv) != 3: + print('Usage: ' + sys.argv[0] + ' ') + sys.exit(1) + +# bucket name as first argument +bucketname = sys.argv[1] +keyname = sys.argv[2] +# endpoint and keys from vstart +endpoint = 'http://127.0.0.1:8000' +access_key='0555b35654ad1656d804' +secret_key='h7GhxuBLTrlhVUyxSPUKUV8r/2EI4ngqJxD7iBdBYLhwluN30JaT3Q==' + +client = boto3.client('s3', + endpoint_url=endpoint, + aws_access_key_id=access_key, + aws_secret_access_key=secret_key) + +print('deleting object first') +js_print(client.delete_object(Bucket=bucketname, Key=keyname)) +print('appending at position 0') +resp = client.put_object(Bucket=bucketname, Key=keyname, + Append=True, + AppendPosition=0, + Body='8letters') + +js_print(resp) +append_pos = resp['AppendPosition'] +print('appending at position %d' % append_pos) +js_print(client.put_object(Bucket=bucketname, Key=keyname, + Append=True, + AppendPosition=append_pos, + Body='8letters')) diff --git a/examples/boto3/get_usage_stats.py b/examples/boto3/get_usage_stats.py new file mode 100755 index 0000000000000..0b7880d4f6638 --- /dev/null +++ b/examples/boto3/get_usage_stats.py @@ -0,0 +1,17 @@ +#!/usr/bin/python +from __future__ import print_function + +import boto3 +import json + +# endpoint and keys from vstart +endpoint = 'http://127.0.0.1:8000' +access_key='0555b35654ad1656d804' +secret_key='h7GhxuBLTrlhVUyxSPUKUV8r/2EI4ngqJxD7iBdBYLhwluN30JaT3Q==' + +client = boto3.client('s3', + endpoint_url=endpoint, + aws_access_key_id=access_key, + aws_secret_access_key=secret_key) + +print(json.dumps(client.get_usage_stats(), indent=2)) diff --git a/examples/boto3/service-2.sdk-extras.json b/examples/boto3/service-2.sdk-extras.json index f69912c0bbec5..65883226366f8 100644 --- a/examples/boto3/service-2.sdk-extras.json +++ b/examples/boto3/service-2.sdk-extras.json @@ -12,6 +12,17 @@ "input":{"shape":"DeleteBucketNotificationConfigurationRequest"}, "documentationUrl":"https://docs.ceph.com/docs/master/radosgw/s3/bucketops/#delete-notification", "documentation":"

Deletes the notification configuration from the bucket.

" + }, + "GetUsageStats":{ + "name":"GetUsageStats", + "http":{ + "method":"GET", + "requestUri":"/?usage", + "responseCode":200 + }, + "output": {"shape": "GetUsageStatsOutput"}, + "documentationUrl":"https://docs.ceph.com/docs/master/radosgw/s3/serviceops#get-usage-stats", + "documentation":"

Get usage stats for the user

" } }, "shapes": { @@ -26,6 +37,35 @@ } }, "AllowUnordered":{"type":"boolean"}, + "PutObjectRequest": { + "members": { + "AppendPosition": { + "shape":"AppendPosition", + "documentation": "

Position to allow appending

", + "location": "querystring", + "locationName": "position" + }, + "Append": { + "shape":"Append", + "documentation":"

Append Object

", + "location": "querystring", + "locationName": "append" + } + } + }, + "Append": {"type":"boolean"}, + "AppendPosition":{"type":"integer"}, + "PutObjectOutput": { + "members": { + "AppendPosition": { + "shape":"AppendPosition", + "documentation": "

Position to allow appending

", + "location": "header", + "locationName": "x-rgw-next-append-position", + "documentationUrl":"https://docs.ceph.com/docs/master/radosgw/s3/objectops/#append-object" + } + } + }, "GetBucketNotificationConfigurationRequest":{ "type":"structure", "required":["Bucket"], @@ -138,7 +178,27 @@ } }, "documentation":"

A container for object tags filtering rules.

" - } + }, + "GetUsageStatsOutput": { + "type": "structure", + "members": { + "Summary": { + "shape":"UsageStatsSummary", + "documentation": "

" + } + } + }, + "UsageStatsSummary": { + "type": "structure", + "members": { + "TotalBytes":{"shape":"TotalBytes"}, + "TotalBytesRounded":{"shape":"TotalBytesRounded"}, + "TotalEntries":{"shape":"TotalEntries"} + } + }, + "TotalBytesRounded":{"type":"integer"}, + "TotalBytes":{"type":"integer"}, + "TotalEntries":{"type":"integer"} }, "documentation":"

" }