diff --git a/glanceclient/tests/unit/test_shell.py b/glanceclient/tests/unit/test_shell.py index 2a33dc00..e0f9ff75 100644 --- a/glanceclient/tests/unit/test_shell.py +++ b/glanceclient/tests/unit/test_shell.py @@ -178,6 +178,20 @@ class ShellTest(testutils.TestCase): self.assertNotIn('', actual) 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('', 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('', actual) + self.assertFalse(et_mock.called) + def test_get_base_parser(self): test_shell = openstack_shell.OpenStackImagesShell() actual_parser = test_shell.get_base_parser() diff --git a/glanceclient/v2/namespace_schema.py b/glanceclient/v2/namespace_schema.py new file mode 100644 index 00000000..36c8833b --- /dev/null +++ b/glanceclient/v2/namespace_schema.py @@ -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" + }, + } +} diff --git a/glanceclient/v2/resource_type_schema.py b/glanceclient/v2/resource_type_schema.py new file mode 100644 index 00000000..8ad04bfb --- /dev/null +++ b/glanceclient/v2/resource_type_schema.py @@ -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" + } + } +} diff --git a/glanceclient/v2/shell.py b/glanceclient/v2/shell.py index 1408027c..9aebeada 100644 --- a/glanceclient/v2/shell.py +++ b/glanceclient/v2/shell.py @@ -22,6 +22,8 @@ from glanceclient import exc from glanceclient.v2 import image_members from glanceclient.v2 import image_schema from glanceclient.v2 import images +from glanceclient.v2 import namespace_schema +from glanceclient.v2 import resource_type_schema from glanceclient.v2 import tasks import json import os @@ -454,6 +456,8 @@ def get_namespace_schema(): with open(schema_path, "r") as f: schema_raw = f.read() NAMESPACE_SCHEMA = json.loads(schema_raw) + else: + return namespace_schema.BASE_SCHEMA return NAMESPACE_SCHEMA @@ -601,6 +605,8 @@ def get_resource_type_schema(): with open(schema_path, "r") as f: schema_raw = f.read() RESOURCE_TYPE_SCHEMA = json.loads(schema_raw) + else: + return resource_type_schema.BASE_SCHEMA return RESOURCE_TYPE_SCHEMA