Comment 3 for bug 1585917

Revision history for this message
Brian Rosmaita (brian-rosmaita) wrote :

Hopefully this suggestion isn't completely insane. What if we update the schema to accommodate *all* the member related calls, that is, member-create, member-show, and member-update? I think the following will work. I tested it out quickly in the online json-validator, and it does seem to handle the current request bodies and request response.

http://jsonschemalint.com/draft4/#

Here's the schema:

{
    "id": "http://openstack.org/glance/member/schema#",
    "$schema": "http://json-schema.org/draft-04/schema#",
    "description": "OpenStack Glance image member schema for member-create, member-detail, and member-update requests.",
    "type": "object",
    "oneOf": [
        { "$ref": "#/definitions/image-member-create-request" },
        { "$ref": "#/definitions/image-member-detail-response" },
        { "$ref": "#/definitions/image-member-update-request" }
    ],
    "definitions": {
        "image-member-create-request": {
            "additionalProperties": false,
            "properties": {
                "member": {
                    "description": "An identifier for the image member (tenantId). (The image_id of the image to which this request applies is specified in the path of the request.)",
                    "maxLength": 255,
                    "type": "string"
                }
            },
            "required": [
                "member"
            ]
        },
        "image-member-detail-response": {
            "additionalProperties": false,
            "properties": {
                "created_at": {
                    "description": "Date and time of image member creation",
                    "readOnly": true,
                    "type": "string"
                },
                "image_id": {
                    "description": "An identifier for the image",
                    "pattern": "^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$",
                    "readOnly": true,
                    "type": "string"
                },
                "member_id": {
                    "description": "An identifier for the image member (tenantId)",
                    "maxLength": 255,
                    "readOnly": true,
                    "type": "string"
                },
                "schema": {
                    "readOnly": true,
                    "type": "string"
                },
                "status": {
                    "description": "The status of this image member",
                    "enum": [
                        "pending",
                        "accepted",
                        "rejected"
                    ],
                    "readOnly": true,
                    "type": "string"
                },
                "updated_at": {
                    "description": "Date and time of last modification of image member",
                    "readOnly": true,
                    "type": "string"
                }
            },
            "required": [
                "created_at",
                "image_id",
                "member_id",
                "schema",
                "status",
                "updated_at"
            ]
        },
        "image-member-update-request": {
            "additionalProperties": false,
            "properties": {
                "status": {
                    "description": "Status to which the image member should be set. (The image_id and member_id are specified in the path of the request.)",
                    "enum": [
                        "pending",
                        "accepted",
                        "rejected"
                    ],
                    "type": "string"
                }
            },
            "required": [
                "status"
            ]
        }
    }
}

Pros:
1. present behavior of api is maintained
2. not much change in code (just the schema generation code, i think)
3. I don't think this will require any glanceclient changes

Cons:
1. schema is kind of complicated, but the oneOf structure makes it fairly human readable, and of course machines aren't going to care