Merge "Ship the default metadata schema in the client"
This commit is contained in:
@@ -178,6 +178,20 @@ class ShellTest(testutils.TestCase):
|
|||||||
self.assertNotIn('<unavailable>', actual)
|
self.assertNotIn('<unavailable>', actual)
|
||||||
self.assertFalse(et_mock.called)
|
self.assertFalse(et_mock.called)
|
||||||
|
|
||||||
|
argstr = '--os-image-api-version 2 help md-namespace-create'
|
||||||
|
with mock.patch.object(shell, '_get_keystone_session') as et_mock:
|
||||||
|
actual = shell.main(argstr.split())
|
||||||
|
self.assertEqual(0, actual)
|
||||||
|
self.assertNotIn('<unavailable>', actual)
|
||||||
|
self.assertFalse(et_mock.called)
|
||||||
|
|
||||||
|
argstr = '--os-image-api-version 2 help md-resource-type-associate'
|
||||||
|
with mock.patch.object(shell, '_get_keystone_session') as et_mock:
|
||||||
|
actual = shell.main(argstr.split())
|
||||||
|
self.assertEqual(0, actual)
|
||||||
|
self.assertNotIn('<unavailable>', actual)
|
||||||
|
self.assertFalse(et_mock.called)
|
||||||
|
|
||||||
def test_get_base_parser(self):
|
def test_get_base_parser(self):
|
||||||
test_shell = openstack_shell.OpenStackImagesShell()
|
test_shell = openstack_shell.OpenStackImagesShell()
|
||||||
actual_parser = test_shell.get_base_parser()
|
actual_parser = test_shell.get_base_parser()
|
||||||
|
243
glanceclient/v2/namespace_schema.py
Normal file
243
glanceclient/v2/namespace_schema.py
Normal file
@@ -0,0 +1,243 @@
|
|||||||
|
# Copyright 2015 OpenStack Foundation
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
|
||||||
|
# NOTE(flaper87): Keep a copy of the current default schema so that
|
||||||
|
# we can react on cases where there's no connection to an OpenStack
|
||||||
|
# deployment. See #1481729
|
||||||
|
BASE_SCHEMA = {
|
||||||
|
"additionalProperties": False,
|
||||||
|
"definitions": {
|
||||||
|
"positiveInteger": {
|
||||||
|
"minimum": 0,
|
||||||
|
"type": "integer"
|
||||||
|
},
|
||||||
|
"positiveIntegerDefault0": {
|
||||||
|
"allOf": [
|
||||||
|
{"$ref": "#/definitions/positiveInteger"},
|
||||||
|
{"default": 0}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"stringArray": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {"type": "string"},
|
||||||
|
"uniqueItems": True
|
||||||
|
},
|
||||||
|
"property": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["title", "type"],
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"operators": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"array",
|
||||||
|
"boolean",
|
||||||
|
"integer",
|
||||||
|
"number",
|
||||||
|
"object",
|
||||||
|
"string",
|
||||||
|
None
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"required": {
|
||||||
|
"$ref": "#/definitions/stringArray"
|
||||||
|
},
|
||||||
|
"minimum": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"maximum": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"maxLength": {
|
||||||
|
"$ref": "#/definitions/positiveInteger"
|
||||||
|
},
|
||||||
|
"minLength": {
|
||||||
|
"$ref": "#/definitions/positiveIntegerDefault0"
|
||||||
|
},
|
||||||
|
"pattern": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "regex"
|
||||||
|
},
|
||||||
|
"enum": {
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"readonly": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"default": {},
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"array",
|
||||||
|
"boolean",
|
||||||
|
"integer",
|
||||||
|
"number",
|
||||||
|
"object",
|
||||||
|
"string",
|
||||||
|
None
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"enum": {
|
||||||
|
"type": "array"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"maxItems": {
|
||||||
|
"$ref": "#/definitions/positiveInteger"
|
||||||
|
},
|
||||||
|
"minItems": {
|
||||||
|
"$ref": "#/definitions/positiveIntegerDefault0"
|
||||||
|
},
|
||||||
|
"uniqueItems": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": False
|
||||||
|
},
|
||||||
|
"additionalItems": {
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["namespace"],
|
||||||
|
"name": "namespace",
|
||||||
|
"properties": {
|
||||||
|
"namespace": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The unique namespace text.",
|
||||||
|
"maxLength": 80
|
||||||
|
},
|
||||||
|
"display_name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The user friendly name for the namespace. Used by "
|
||||||
|
"UI if available.",
|
||||||
|
"maxLength": 80
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Provides a user friendly description of the "
|
||||||
|
"namespace.",
|
||||||
|
"maxLength": 500
|
||||||
|
},
|
||||||
|
"visibility": {
|
||||||
|
"enum": [
|
||||||
|
"public",
|
||||||
|
"private"
|
||||||
|
],
|
||||||
|
"type": "string",
|
||||||
|
"description": "Scope of namespace accessibility."
|
||||||
|
},
|
||||||
|
"protected": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "If true, namespace will not be deletable."
|
||||||
|
},
|
||||||
|
"owner": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Owner of the namespace.",
|
||||||
|
"maxLength": 255
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"type": "string",
|
||||||
|
"readOnly": True,
|
||||||
|
"description": "Date and time of namespace creation.",
|
||||||
|
"format": "date-time"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"type": "string",
|
||||||
|
"readOnly": True,
|
||||||
|
"description": "Date and time of the last namespace modification.",
|
||||||
|
"format": "date-time"
|
||||||
|
},
|
||||||
|
"schema": {
|
||||||
|
"readOnly": True,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"self": {
|
||||||
|
"readOnly": True,
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"resource_type_associations": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"prefix": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"properties_target": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"$ref": "#/definitions/property"
|
||||||
|
},
|
||||||
|
"objects": {
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"required": {
|
||||||
|
"$ref": "#/definitions/stringArray"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"$ref": "#/definitions/property"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
"tags": {
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "array"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
67
glanceclient/v2/resource_type_schema.py
Normal file
67
glanceclient/v2/resource_type_schema.py
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
# Copyright 2015 OpenStack Foundation
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
|
||||||
|
# NOTE(flaper87): Keep a copy of the current default schema so that
|
||||||
|
# we can react on cases where there's no connection to an OpenStack
|
||||||
|
# deployment. See #1481729
|
||||||
|
BASE_SCHEMA = {
|
||||||
|
"additionalProperties": False,
|
||||||
|
"required": ["name"],
|
||||||
|
"name": "resource_type_association",
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Resource type names should be aligned with Heat "
|
||||||
|
"resource types whenever possible: http://docs."
|
||||||
|
"openstack.org/developer/heat/template_guide/"
|
||||||
|
"openstack.html",
|
||||||
|
"maxLength": 80
|
||||||
|
|
||||||
|
},
|
||||||
|
"prefix": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Specifies the prefix to use for the given resource"
|
||||||
|
" type. Any properties in the namespace should be"
|
||||||
|
" prefixed with this prefix when being applied to"
|
||||||
|
" the specified resource type. Must include prefix"
|
||||||
|
" separator (e.g. a colon :).",
|
||||||
|
"maxLength": 80
|
||||||
|
},
|
||||||
|
"properties_target": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Some resource types allow more than one key / "
|
||||||
|
"value pair per instance. For example, Cinder "
|
||||||
|
"allows user and image metadata on volumes. Only "
|
||||||
|
"the image properties metadata is evaluated by Nova"
|
||||||
|
" (scheduling or drivers). This property allows a "
|
||||||
|
"namespace target to remove the ambiguity.",
|
||||||
|
"maxLength": 80
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"type": "string",
|
||||||
|
"readOnly": True,
|
||||||
|
"description": "Date and time of resource type association.",
|
||||||
|
"format": "date-time"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"type": "string",
|
||||||
|
"readOnly": True,
|
||||||
|
"description": "Date and time of the last resource type "
|
||||||
|
"association modification.",
|
||||||
|
"format": "date-time"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -22,6 +22,8 @@ from glanceclient import exc
|
|||||||
from glanceclient.v2 import image_members
|
from glanceclient.v2 import image_members
|
||||||
from glanceclient.v2 import image_schema
|
from glanceclient.v2 import image_schema
|
||||||
from glanceclient.v2 import images
|
from glanceclient.v2 import images
|
||||||
|
from glanceclient.v2 import namespace_schema
|
||||||
|
from glanceclient.v2 import resource_type_schema
|
||||||
from glanceclient.v2 import tasks
|
from glanceclient.v2 import tasks
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
@@ -454,6 +456,8 @@ def get_namespace_schema():
|
|||||||
with open(schema_path, "r") as f:
|
with open(schema_path, "r") as f:
|
||||||
schema_raw = f.read()
|
schema_raw = f.read()
|
||||||
NAMESPACE_SCHEMA = json.loads(schema_raw)
|
NAMESPACE_SCHEMA = json.loads(schema_raw)
|
||||||
|
else:
|
||||||
|
return namespace_schema.BASE_SCHEMA
|
||||||
return NAMESPACE_SCHEMA
|
return NAMESPACE_SCHEMA
|
||||||
|
|
||||||
|
|
||||||
@@ -601,6 +605,8 @@ def get_resource_type_schema():
|
|||||||
with open(schema_path, "r") as f:
|
with open(schema_path, "r") as f:
|
||||||
schema_raw = f.read()
|
schema_raw = f.read()
|
||||||
RESOURCE_TYPE_SCHEMA = json.loads(schema_raw)
|
RESOURCE_TYPE_SCHEMA = json.loads(schema_raw)
|
||||||
|
else:
|
||||||
|
return resource_type_schema.BASE_SCHEMA
|
||||||
return RESOURCE_TYPE_SCHEMA
|
return RESOURCE_TYPE_SCHEMA
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user