Răsfoiți Sursa

Added enforcement of name

Nuwan Goonasekera 8 ani în urmă
părinte
comite
55dbd2f59e

+ 139 - 0
cloudbridge/cloud/base/resources.py

@@ -5,6 +5,7 @@ import inspect
 import itertools
 import itertools
 import logging
 import logging
 import os
 import os
+import re
 import shutil
 import shutil
 import time
 import time
 
 
@@ -45,10 +46,148 @@ log = logging.getLogger(__name__)
 
 
 
 
 class BaseCloudResource(CloudResource):
 class BaseCloudResource(CloudResource):
+    """
+    Base implementation of a CloudBridge Resource.
+    """
+
+    # Regular expression for valid cloudbridge resource names.
+    # They, must match the same criteria as GCE labels.
+    # as discussed here: https://github.com/gvlproject/cloudbridge/issues/55
+    #
+    # NOTE: The following regex is based on GCEs internal validation logic,
+    # and is significantly complex to allow for international characters.
+    CB_NAME_PATTERN = re.compile(
+        r"^[\u0061-\u007A\u00B5\u00DF-\u00F6\u00F8-\u00FF\u0101\u0103\u0105"
+        "\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B"
+        "\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131"
+        "\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146"
+        "\u0148\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B"
+        "\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171"
+        "\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C"
+        "\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA"
+        "\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9\u01BA\u01BD-\u01BF\u01C6\u01C9"
+        "\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC\u01DD\u01DF"
+        "\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF\u01F0\u01F3\u01F5"
+        "\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D"
+        "\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223"
+        "\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F"
+        "\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371"
+        "\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0\u03D1\u03D5-"
+        "\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB"
+        "\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB\u03FC\u0430-\u045F\u0461\u0463"
+        "\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479"
+        "\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497"
+        "\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD"
+        "\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4"
+        "\u04C6\u04C8\u04CA\u04CC\u04CE\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9"
+        "\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF"
+        "\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505"
+        "\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B"
+        "\u051D\u051F\u0521\u0523\u0525\u0527\u0561-\u0587\u1D00-\u1D2B"
+        "\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D"
+        "\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23"
+        "\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39"
+        "\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F"
+        "\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65"
+        "\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B"
+        "\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91"
+        "\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD"
+        "\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3"
+        "\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9"
+        "\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF"
+        "\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15"
+        "\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67"
+        "\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4"
+        "\u1FB6\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6\u1FC7\u1FD0-\u1FD3\u1FD6\u1FD7"
+        "\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6\u1FF7\u210A\u210E\u210F\u2113\u212F"
+        "\u2134\u2139\u213C\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61"
+        "\u2C65\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73\u2C74\u2C76-\u2C7B\u2C81"
+        "\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97"
+        "\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD"
+        "\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3"
+        "\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9"
+        "\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25"
+        "\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651"
+        "\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667"
+        "\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F"
+        "\uA691\uA693\uA695\uA697\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-"
+        "\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745"
+        "\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B"
+        "\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-"
+        "\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791"
+        "\uA793\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7FA\uFB00-\uFB06\uFB13-\uFB17"
+        "\uFF41-\uFF5A\u00AA\u00BA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA"
+        "\u05F0-\u05F2\u0620-\u063F\u0641-\u064A\u066E\u066F\u0671-\u06D3"
+        "\u06D5\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-"
+        "\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u08A0\u08A2-"
+        "\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0977\u0979-"
+        "\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2"
+        "\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1"
+        "\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33"
+        "\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-"
+        "\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-"
+        "\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-"
+        "\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D"
+        "\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95"
+        "\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-"
+        "\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33"
+        "\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-"
+        "\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0"
+        "\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D"
+        "\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-"
+        "\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E45"
+        "\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-"
+        "\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2"
+        "\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-"
+        "\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D"
+        "\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10D0-\u10FA"
+        "\u10FD-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-"
+        "\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0"
+        "\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A"
+        "\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A"
+        "\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751"
+        "\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-"
+        "\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D"
+        "\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54"
+        "\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5"
+        "\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1"
+        "\u1CF5\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6"
+        "\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE"
+        "\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-"
+        "\u30FA\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF"
+        "\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7"
+        "\uA500-\uA60B\uA610-\uA61F\uA62A\uA62B\uA66E\uA6A0-\uA6E5\uA7FB-"
+        "\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-"
+        "\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C"
+        "\uA984-\uA9B2\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F"
+        "\uAA71-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD"
+        "\uAAC0\uAAC2\uAADB\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-"
+        "\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-"
+        "\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D"
+        "\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43"
+        "\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-"
+        "\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-"
+        "\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC\u0030-"
+        "\u0039\u00B2\u00B3\u00B9\u00BC-\u00BE\u0660-\u0669\u06F0-\u06F9"
+        "\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u09F4-\u09F9\u0A66-\u0A6F"
+        "\u0AE6-\u0AEF\u0B66-\u0B6F\u0B72-\u0B77\u0BE6-\u0BF2\u0C66-\u0C6F"
+        "\u0C78-\u0C7E\u0CE6-\u0CEF\u0D66-\u0D75\u0E50-\u0E59\u0ED0-\u0ED9"
+        "\u0F20-\u0F33\u1040-\u1049\u1090-\u1099\u1369-\u137C\u16EE-\u16F0"
+        "\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1946-\u194F\u19D0-\u19DA"
+        "\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49"
+        "\u1C50-\u1C59\u2070\u2074-\u2079\u2080-\u2089\u2150-\u2182\u2185-"
+        "\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2CFD\u3007\u3021-"
+        "\u3029\u3038-\u303A\u3192-\u3195\u3220-\u3229\u3248-\u324F\u3251-"
+        "\u325F\u3280-\u3289\u32B1-\u32BF\uA620-\uA629\uA6E6-\uA6EF\uA830-"
+        "\uA835\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uAA50-\uAA59\uABF0-"
+        "\uABF9\uFF10-\uFF19_-]{0,63}$", re.UNICODE)
 
 
     def __init__(self, provider):
     def __init__(self, provider):
         self.__provider = provider
         self.__provider = provider
 
 
+    def is_valid_resource_name(self, name):
+        return True if self.CB_NAME_PATTERN.match(name) else False
+
     @property
     @property
     def _provider(self):
     def _provider(self):
         return self.__provider
         return self.__provider

+ 13 - 0
cloudbridge/cloud/interfaces/exceptions.py

@@ -36,3 +36,16 @@ class ProviderConnectionException(CloudBridgeBaseException):
     settings are invalid.
     settings are invalid.
     """
     """
     pass
     pass
+
+
+class InvalidNameException(CloudBridgeBaseException):
+    """
+    Marker interface for any attempt to set an invalid name on
+    a cloudbridge resource.An example would be setting uppercase
+    letters, which are not allowed in a resource name.
+    """
+    def __init__(self, name):
+        super(InvalidNameException, self).__init__(
+            u"Invalid name: %s. Name must be at most 63 characters long"
+            " and consist of lowercase letters, numbers, underscores, dashes"
+            " or international characters" % name)

+ 26 - 7
cloudbridge/cloud/providers/aws/resources.py

@@ -28,6 +28,7 @@ from cloudbridge.cloud.base.resources import BaseSnapshot
 from cloudbridge.cloud.base.resources import BaseSubnet
 from cloudbridge.cloud.base.resources import BaseSubnet
 from cloudbridge.cloud.base.resources import BaseVolume
 from cloudbridge.cloud.base.resources import BaseVolume
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.resources import ClientPagedResultList
+from cloudbridge.cloud.interfaces.exceptions import InvalidNameException
 from cloudbridge.cloud.interfaces.resources import InstanceState
 from cloudbridge.cloud.interfaces.resources import InstanceState
 from cloudbridge.cloud.interfaces.resources import MachineImageState
 from cloudbridge.cloud.interfaces.resources import MachineImageState
 from cloudbridge.cloud.interfaces.resources import NetworkState
 from cloudbridge.cloud.interfaces.resources import NetworkState
@@ -257,7 +258,10 @@ class AWSInstance(BaseInstance):
         """
         """
         Set the instance name.
         Set the instance name.
         """
         """
-        self._ec2_instance.add_tag('Name', value)
+        if self.is_valid_resource_name(value):
+            self._ec2_instance.add_tag('Name', value)
+        else:
+            raise InvalidNameException(value)
 
 
     @property
     @property
     def public_ips(self):
     def public_ips(self):
@@ -444,7 +448,10 @@ class AWSVolume(BaseVolume):
         """
         """
         Set the volume name.
         Set the volume name.
         """
         """
-        self._volume.add_tag('Name', value)
+        if self.is_valid_resource_name(value):
+            self._volume.add_tag('Name', value)
+        else:
+            raise InvalidNameException(value)
 
 
     @property
     @property
     def description(self):
     def description(self):
@@ -565,7 +572,10 @@ class AWSSnapshot(BaseSnapshot):
         """
         """
         Set the snapshot name.
         Set the snapshot name.
         """
         """
-        self._snapshot.add_tag('Name', value)
+        if self.is_valid_resource_name(value):
+            self._snapshot.add_tag('Name', value)
+        else:
+            raise InvalidNameException(value)
 
 
     @property
     @property
     def description(self):
     def description(self):
@@ -617,7 +627,7 @@ class AWSSnapshot(BaseSnapshot):
         ec2_vol = self._snapshot.create_volume(placement, size, volume_type,
         ec2_vol = self._snapshot.create_volume(placement, size, volume_type,
                                                iops)
                                                iops)
         cb_vol = AWSVolume(self._provider, ec2_vol)
         cb_vol = AWSVolume(self._provider, ec2_vol)
-        cb_vol.name = "Created from {0} ({1})".format(self.id, self.name)
+        cb_vol.name = "from_snap_{0}".format(self.id or self.name)
         return cb_vol
         return cb_vol
 
 
 
 
@@ -989,7 +999,10 @@ class AWSNetwork(BaseNetwork):
         """
         """
         Set the network name.
         Set the network name.
         """
         """
-        self._vpc.add_tag('Name', value)
+        if self.is_valid_resource_name(value):
+            self._vpc.add_tag('Name', value)
+        else:
+            raise InvalidNameException(value)
 
 
     @property
     @property
     def external(self):
     def external(self):
@@ -1057,7 +1070,10 @@ class AWSSubnet(BaseSubnet):
         """
         """
         Set the subnet name.
         Set the subnet name.
         """
         """
-        self._subnet.add_tag('Name', value)
+        if self.is_valid_resource_name(value):
+            self._subnet.add_tag('Name', value)
+        else:
+            raise InvalidNameException(value)
 
 
     @property
     @property
     def cidr_block(self):
     def cidr_block(self):
@@ -1145,7 +1161,10 @@ class AWSRouter(BaseRouter):
         """
         """
         Set the router name.
         Set the router name.
         """
         """
-        self._router.add_tag('Name', value)
+        if self.is_valid_resource_name(value):
+            self._router.add_tag('Name', value)
+        else:
+            raise InvalidNameException(value)
 
 
     def refresh(self):
     def refresh(self):
         self._router = self._provider.vpc_conn.get_all_internet_gateways(
         self._router = self._provider.vpc_conn.get_all_internet_gateways(

+ 51 - 7
cloudbridge/cloud/providers/openstack/resources.py

@@ -24,6 +24,7 @@ from cloudbridge.cloud.base.resources import BaseSnapshot
 from cloudbridge.cloud.base.resources import BaseSubnet
 from cloudbridge.cloud.base.resources import BaseSubnet
 from cloudbridge.cloud.base.resources import BaseVolume
 from cloudbridge.cloud.base.resources import BaseVolume
 from cloudbridge.cloud.base.resources import ClientPagedResultList
 from cloudbridge.cloud.base.resources import ClientPagedResultList
+from cloudbridge.cloud.interfaces.exceptions import InvalidNameException
 from cloudbridge.cloud.interfaces.resources import InstanceState
 from cloudbridge.cloud.interfaces.resources import InstanceState
 from cloudbridge.cloud.interfaces.resources import MachineImageState
 from cloudbridge.cloud.interfaces.resources import MachineImageState
 from cloudbridge.cloud.interfaces.resources import NetworkState
 from cloudbridge.cloud.interfaces.resources import NetworkState
@@ -41,6 +42,7 @@ import swiftclient
 
 
 from swiftclient.service import SwiftService, SwiftUploadObject
 from swiftclient.service import SwiftService, SwiftUploadObject
 
 
+
 ONE_GIG = 1048576000  # in bytes
 ONE_GIG = 1048576000  # in bytes
 FIVE_GIG = ONE_GIG * 5  # in bytes
 FIVE_GIG = ONE_GIG * 5  # in bytes
 
 
@@ -265,8 +267,11 @@ class OpenStackInstance(BaseInstance):
         """
         """
         Set the instance name.
         Set the instance name.
         """
         """
-        self._os_instance.name = value
-        self._os_instance.update()
+        if self.is_valid_resource_name(value):
+            self._os_instance.name = value
+            self._os_instance.update()
+        else:
+            raise InvalidNameException(value)
 
 
     @property
     @property
     def public_ips(self):
     def public_ips(self):
@@ -485,8 +490,11 @@ class OpenStackVolume(BaseVolume):
         """
         """
         Set the volume name.
         Set the volume name.
         """
         """
-        self._volume.name = value
-        self._volume.update(name=value)
+        if self.is_valid_resource_name(value):
+            self._volume.name = value
+            self._volume.update(name=value)
+        else:
+            raise InvalidNameException(value)
 
 
     @property
     @property
     def description(self):
     def description(self):
@@ -605,8 +613,11 @@ class OpenStackSnapshot(BaseSnapshot):
         """
         """
         Set the snapshot name.
         Set the snapshot name.
         """
         """
-        self._snapshot.name = value
-        self._snapshot.update(name=value)
+        if self.is_valid_resource_name(value):
+            self._snapshot.name = value
+            self._snapshot.update(name=value)
+        else:
+            raise InvalidNameException(value)
 
 
     @property
     @property
     def description(self):
     def description(self):
@@ -658,7 +669,7 @@ class OpenStackSnapshot(BaseSnapshot):
         """
         """
         Create a new Volume from this Snapshot.
         Create a new Volume from this Snapshot.
         """
         """
-        vol_name = "Created from {0} ({1})".format(self.id, self.name)
+        vol_name = "from_snap_{0}".format(self.id or self.name)
         size = size if size else self._snapshot.size
         size = size if size else self._snapshot.size
         os_vol = self._provider.cinder.volumes.create(
         os_vol = self._provider.cinder.volumes.create(
             size, name=vol_name, availability_zone=placement,
             size, name=vol_name, availability_zone=placement,
@@ -695,6 +706,17 @@ class OpenStackNetwork(BaseNetwork):
     def name(self):
     def name(self):
         return self._network.get('name', None)
         return self._network.get('name', None)
 
 
+    @name.setter
+    def name(self, value):  # pylint:disable=arguments-differ
+        """
+        Set the network name.
+        """
+        if self.is_valid_resource_name(value):
+            self._network.name = value
+            self._network.update(name=value)
+        else:
+            raise InvalidNameException(value)
+
     @property
     @property
     def external(self):
     def external(self):
         return self._network.get('router:external', False)
         return self._network.get('router:external', False)
@@ -751,6 +773,17 @@ class OpenStackSubnet(BaseSubnet):
     def name(self):
     def name(self):
         return self._subnet.get('name', None)
         return self._subnet.get('name', None)
 
 
+    @name.setter
+    def name(self, value):  # pylint:disable=arguments-differ
+        """
+        Set the subnet name.
+        """
+        if self.is_valid_resource_name(value):
+            self._subnet.name = value
+            self._subnet.update(name=value)
+        else:
+            raise InvalidNameException(value)
+
     @property
     @property
     def cidr_block(self):
     def cidr_block(self):
         return self._subnet.get('cidr', None)
         return self._subnet.get('cidr', None)
@@ -818,6 +851,17 @@ class OpenStackRouter(BaseRouter):
     def name(self):
     def name(self):
         return self._router.get('name', None)
         return self._router.get('name', None)
 
 
+    @name.setter
+    def name(self, value):  # pylint:disable=arguments-differ
+        """
+        Set the router name.
+        """
+        if self.is_valid_resource_name(value):
+            self._router.name = value
+            self._router.update(name=value)
+        else:
+            raise InvalidNameException(value)
+
     def refresh(self):
     def refresh(self):
         self._router = self._provider.neutron.show_router(self.id)['router']
         self._router = self._provider.neutron.show_router(self.id)['router']
 
 

+ 5 - 0
test/helpers/__init__.py

@@ -2,6 +2,7 @@ import functools
 import os
 import os
 import sys
 import sys
 import unittest
 import unittest
+import uuid
 
 
 from contextlib import contextmanager
 from contextlib import contextmanager
 
 
@@ -167,6 +168,10 @@ def cleanup_test_resources(instance=None, network=None, security_group=None,
                 delete_test_instance(instance)
                 delete_test_instance(instance)
 
 
 
 
+def get_uuid():
+    return str(uuid.uuid4()).replace("-", "")
+
+
 class ProviderTestBase(unittest.TestCase):
 class ProviderTestBase(unittest.TestCase):
 
 
     _provider = None
     _provider = None

+ 20 - 27
test/test_block_store_service.py

@@ -20,7 +20,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
         Create a new volume, check whether the expected values are set,
         Create a new volume, check whether the expected values are set,
         and delete it
         and delete it
         """
         """
-        name = "CBUnitTestCreateVol-{0}".format(uuid.uuid4())
+        name = "cb_createvol-{0}".format(helpers.get_uuid())
         test_vol = self.provider.block_store.volumes.create(
         test_vol = self.provider.block_store.volumes.create(
             name,
             name,
             1,
             1,
@@ -43,9 +43,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
         """
         """
         Create a new volume, and attempt to attach it to an instance
         Create a new volume, and attempt to attach it to an instance
         """
         """
-        instance_name = "CBVolOps-{0}-{1}".format(
-            self.provider.name,
-            uuid.uuid4())
+        name = "cb_attachvol-{0}".format(helpers.get_uuid())
         # Declare these variables and late binding will allow
         # Declare these variables and late binding will allow
         # the cleanup method access to the most current values
         # the cleanup method access to the most current values
         net = None
         net = None
@@ -53,10 +51,10 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
         with helpers.cleanup_action(lambda: helpers.cleanup_test_resources(
         with helpers.cleanup_action(lambda: helpers.cleanup_test_resources(
                 test_instance, net)):
                 test_instance, net)):
             net, subnet = helpers.create_test_network(
             net, subnet = helpers.create_test_network(
-                self.provider, instance_name)
+                self.provider, name)
             test_instance = helpers.get_test_instance(
             test_instance = helpers.get_test_instance(
-                self.provider, instance_name, subnet=subnet)
-            name = "CBUnitTestAttachVol-{0}".format(uuid.uuid4())
+                self.provider, name, subnet=subnet)
+
             test_vol = self.provider.block_store.volumes.create(
             test_vol = self.provider.block_store.volumes.create(
                 name, 1, test_instance.zone_id)
                 name, 1, test_instance.zone_id)
             with helpers.cleanup_action(lambda: test_vol.delete()):
             with helpers.cleanup_action(lambda: test_vol.delete()):
@@ -75,9 +73,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
         """
         """
         Test volume properties
         Test volume properties
         """
         """
-        instance_name = "CBVolProps-{0}-{1}".format(
-            self.provider.name,
-            uuid.uuid4())
+        name = "cb_volprops-{0}".format(helpers.get_uuid())
         vol_desc = 'newvoldesc1'
         vol_desc = 'newvoldesc1'
         # Declare these variables and late binding will allow
         # Declare these variables and late binding will allow
         # the cleanup method access to the most current values
         # the cleanup method access to the most current values
@@ -86,11 +82,10 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
         with helpers.cleanup_action(lambda: helpers.cleanup_test_resources(
         with helpers.cleanup_action(lambda: helpers.cleanup_test_resources(
                 test_instance, net)):
                 test_instance, net)):
             net, subnet = helpers.create_test_network(
             net, subnet = helpers.create_test_network(
-                self.provider, instance_name)
+                self.provider, name)
             test_instance = helpers.get_test_instance(
             test_instance = helpers.get_test_instance(
-                self.provider, instance_name, subnet=subnet)
+                self.provider, name, subnet=subnet)
 
 
-            name = "CBUnitTestVolProps-{0}".format(uuid.uuid4())
             test_vol = self.provider.block_store.volumes.create(
             test_vol = self.provider.block_store.volumes.create(
                 name, 1, test_instance.zone_id, description=vol_desc)
                 name, 1, test_instance.zone_id, description=vol_desc)
             with helpers.cleanup_action(lambda: test_vol.delete()):
             with helpers.cleanup_action(lambda: test_vol.delete()):
@@ -140,14 +135,14 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
         whether list_snapshots properly detects the new snapshot.
         whether list_snapshots properly detects the new snapshot.
         Delete everything afterwards.
         Delete everything afterwards.
         """
         """
-        name = "CBUnitTestCreateSnap-{0}".format(uuid.uuid4())
+        name = "cb_crudsnap-{0}".format(helpers.get_uuid())
         test_vol = self.provider.block_store.volumes.create(
         test_vol = self.provider.block_store.volumes.create(
             name,
             name,
             1,
             1,
             helpers.get_provider_test_data(self.provider, "placement"))
             helpers.get_provider_test_data(self.provider, "placement"))
         with helpers.cleanup_action(lambda: test_vol.delete()):
         with helpers.cleanup_action(lambda: test_vol.delete()):
             test_vol.wait_till_ready()
             test_vol.wait_till_ready()
-            snap_name = "CBSnapshot-{0}".format(name)
+            snap_name = "cb_snap-{0}".format(name)
             test_snap = test_vol.create_snapshot(name=snap_name,
             test_snap = test_vol.create_snapshot(name=snap_name,
                                                  description=snap_name)
                                                  description=snap_name)
 
 
@@ -163,7 +158,7 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
                     self, self.provider.block_store.snapshots, test_snap)
                     self, self.provider.block_store.snapshots, test_snap)
 
 
                 # Test volume creation from a snapshot (via VolumeService)
                 # Test volume creation from a snapshot (via VolumeService)
-                sv_name = "CBUnitTestSnapVol-{0}".format(name)
+                sv_name = "cb_snapvol_{0}".format(name)
                 snap_vol = self.provider.block_store.volumes.create(
                 snap_vol = self.provider.block_store.volumes.create(
                     sv_name,
                     sv_name,
                     1,
                     1,
@@ -182,30 +177,28 @@ class CloudBlockStoreServiceTestCase(ProviderTestBase):
                 self, self.provider.block_store.snapshots, test_snap)
                 self, self.provider.block_store.snapshots, test_snap)
 
 
             # Test creation of a snap via SnapshotService
             # Test creation of a snap via SnapshotService
-            snap_too_name = "CBSnapToo-{0}".format(name)
+            snap_two_name = "cb_snaptwo-{0}".format(name)
             time.sleep(15)  # Or get SnapshotCreationPerVolumeRateExceeded
             time.sleep(15)  # Or get SnapshotCreationPerVolumeRateExceeded
-            test_snap_too = self.provider.block_store.snapshots.create(
-                name=snap_too_name, volume=test_vol, description=snap_too_name)
-            with helpers.cleanup_action(lambda: cleanup_snap(test_snap_too)):
-                test_snap_too.wait_till_ready()
-                self.assertTrue(
-                    test_snap_too.id in repr(test_snap_too),
-                    "repr(obj) should contain the object id so that the object"
-                    " can be reconstructed, but does not.")
+            test_snap_two = self.provider.block_store.snapshots.create(
+                name=snap_two_name, volume=test_vol, description=snap_two_name)
+            with helpers.cleanup_action(lambda: cleanup_snap(test_snap_two)):
+                test_snap_two.wait_till_ready()
+                sit.check_standard_behaviour(
+                    self, self.provider.block_store.snapshots, test_snap_two)
 
 
     @helpers.skipIfNoService(['block_store.snapshots'])
     @helpers.skipIfNoService(['block_store.snapshots'])
     def test_snapshot_properties(self):
     def test_snapshot_properties(self):
         """
         """
         Test snapshot properties
         Test snapshot properties
         """
         """
-        name = "CBTestSnapProp-{0}".format(uuid.uuid4())
+        name = "cb_snapprop-{0}".format(uuid.uuid4())
         test_vol = self.provider.block_store.volumes.create(
         test_vol = self.provider.block_store.volumes.create(
             name,
             name,
             1,
             1,
             helpers.get_provider_test_data(self.provider, "placement"))
             helpers.get_provider_test_data(self.provider, "placement"))
         with helpers.cleanup_action(lambda: test_vol.delete()):
         with helpers.cleanup_action(lambda: test_vol.delete()):
             test_vol.wait_till_ready()
             test_vol.wait_till_ready()
-            snap_name = "CBSnapProp-{0}".format(name)
+            snap_name = "cb_snap-{0}".format(name)
             test_snap = test_vol.create_snapshot(name=snap_name,
             test_snap = test_vol.create_snapshot(name=snap_name,
                                                  description=snap_name)
                                                  description=snap_name)
 
 

+ 4 - 18
test/test_compute_service.py

@@ -1,5 +1,4 @@
 import ipaddress
 import ipaddress
-import uuid
 
 
 from test import helpers
 from test import helpers
 from test.helpers import ProviderTestBase
 from test.helpers import ProviderTestBase
@@ -19,9 +18,7 @@ class CloudComputeServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['compute.instances', 'network'])
     @helpers.skipIfNoService(['compute.instances', 'network'])
     def test_crud_instance(self):
     def test_crud_instance(self):
-        name = "CBInstCrud-{0}-{1}".format(
-            self.provider.name,
-            uuid.uuid4())
+        name = "cb_instcrud-{0}".format(helpers.get_uuid())
         # Declare these variables and late binding will allow
         # Declare these variables and late binding will allow
         # the cleanup method access to the most current values
         # the cleanup method access to the most current values
         inst = None
         inst = None
@@ -54,9 +51,7 @@ class CloudComputeServiceTestCase(ProviderTestBase):
                               'security.security_groups',
                               'security.security_groups',
                               'security.key_pairs'])
                               'security.key_pairs'])
     def test_instance_properties(self):
     def test_instance_properties(self):
-        name = "CBInstProps-{0}-{1}".format(
-            self.provider.name,
-            uuid.uuid4())
+        name = "cb_inst_props-{0}".format(helpers.get_uuid())
 
 
         # Declare these variables and late binding will allow
         # Declare these variables and late binding will allow
         # the cleanup method access to the most current values
         # the cleanup method access to the most current values
@@ -74,11 +69,6 @@ class CloudComputeServiceTestCase(ProviderTestBase):
                                                       name, key_pair=kp,
                                                       name, key_pair=kp,
                                                       security_groups=[sg],
                                                       security_groups=[sg],
                                                       subnet=subnet)
                                                       subnet=subnet)
-
-            self.assertTrue(
-                test_instance.id in repr(test_instance),
-                "repr(obj) should contain the object id so that the object"
-                " can be reconstructed, but does not. eval(repr(obj)) == obj")
             self.assertEqual(
             self.assertEqual(
                 test_instance.name, name,
                 test_instance.name, name,
                 "Instance name {0} is not equal to the expected name"
                 "Instance name {0} is not equal to the expected name"
@@ -204,9 +194,7 @@ class CloudComputeServiceTestCase(ProviderTestBase):
     @helpers.skipIfNoService(['compute.instances', 'compute.images',
     @helpers.skipIfNoService(['compute.instances', 'compute.images',
                               'compute.instance_types', 'block_store.volumes'])
                               'compute.instance_types', 'block_store.volumes'])
     def test_block_device_mapping_attachments(self):
     def test_block_device_mapping_attachments(self):
-        name = "CBInstBlkAttch-{0}-{1}".format(
-            self.provider.name,
-            uuid.uuid4())
+        name = "cb_blkattch-{0}".format(helpers.get_uuid())
 
 
         # Comment out BDM tests because OpenStack is not stable enough yet
         # Comment out BDM tests because OpenStack is not stable enough yet
         if True:
         if True:
@@ -292,9 +280,7 @@ class CloudComputeServiceTestCase(ProviderTestBase):
     @helpers.skipIfNoService(['compute.instances', 'network',
     @helpers.skipIfNoService(['compute.instances', 'network',
                               'security.security_groups'])
                               'security.security_groups'])
     def test_instance_methods(self):
     def test_instance_methods(self):
-        name = "CBInstProps-{0}-{1}".format(
-            self.provider.name,
-            uuid.uuid4())
+        name = "cb_instmethod-{0}".format(helpers.get_uuid())
 
 
         # Declare these variables and late binding will allow
         # Declare these variables and late binding will allow
         # the cleanup method access to the most current values
         # the cleanup method access to the most current values

+ 2 - 6
test/test_image_service.py

@@ -1,5 +1,3 @@
-import uuid
-
 from test import helpers
 from test import helpers
 from test.helpers import ProviderTestBase
 from test.helpers import ProviderTestBase
 from test.helpers import standard_interface_tests as sit
 from test.helpers import standard_interface_tests as sit
@@ -18,9 +16,7 @@ class CloudImageServiceTestCase(ProviderTestBase):
         This covers waiting till the image is ready, checking that the image
         This covers waiting till the image is ready, checking that the image
         name is the expected one and whether list_images is functional.
         name is the expected one and whether list_images is functional.
         """
         """
-        instance_name = "CBImageTest-{0}-{1}".format(
-            self.provider.name,
-            uuid.uuid4())
+        instance_name = "cb_crudimage-{0}".format(helpers.get_uuid())
 
 
         # Declare these variables and late binding will allow
         # Declare these variables and late binding will allow
         # the cleanup method access to the most current values
         # the cleanup method access to the most current values
@@ -33,7 +29,7 @@ class CloudImageServiceTestCase(ProviderTestBase):
             test_instance = helpers.get_test_instance(
             test_instance = helpers.get_test_instance(
                 self.provider, instance_name, subnet=subnet)
                 self.provider, instance_name, subnet=subnet)
 
 
-            name = "CBUnitTestListImg-{0}".format(uuid.uuid4())
+            name = "cb_listimg-{0}".format(helpers.get_uuid())
             test_image = test_instance.create_image(name)
             test_image = test_instance.create_image(name)
 
 
             def cleanup_img(img):
             def cleanup_img(img):

+ 10 - 31
test/test_network_service.py

@@ -1,5 +1,4 @@
 import test.helpers as helpers
 import test.helpers as helpers
-import uuid
 
 
 from test.helpers import ProviderTestBase
 from test.helpers import ProviderTestBase
 from test.helpers import standard_interface_tests as sit
 from test.helpers import standard_interface_tests as sit
@@ -11,8 +10,8 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['network'])
     @helpers.skipIfNoService(['network'])
     def test_crud_network_service(self):
     def test_crud_network_service(self):
-        name = 'cbtestnetworkservice-{0}'.format(uuid.uuid4())
-        subnet_name = 'cbtestsubnetservice-{0}'.format(uuid.uuid4())
+        name = 'cb_crudnetwork-{0}'.format(helpers.get_uuid())
+        subnet_name = 'cb_crudsubnet-{0}'.format(helpers.get_uuid())
         net = self.provider.network.create(name=name)
         net = self.provider.network.create(name=name)
         with helpers.cleanup_action(
         with helpers.cleanup_action(
             lambda:
             lambda:
@@ -28,25 +27,10 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
                 lambda:
                 lambda:
                     self.provider.network.subnets.delete(subnet=subnet)
                     self.provider.network.subnets.delete(subnet=subnet)
             ):
             ):
-                # test list method
-                subnetl = self.provider.network.subnets.list(network=net)
-                list_subnetl = [n for n in subnetl if n.name == subnet_name]
-                self.assertTrue(
-                    len(list_subnetl) == 1,
-                    "List subnets does not return the expected subnet %s" %
-                    subnet_name)
-                # test get method
-                sn = self.provider.network.subnets.get(subnet.id)
-                self.assertTrue(
-                    subnet.id == sn.id,
-                    "GETting subnet should return the same subnet")
+                sit.check_standard_behaviour(
+                    self, self.provider.network.subnets, subnet)
 
 
-            subnetl = self.provider.network.subnets.list()
-            found_subnet = [n for n in subnetl if n.name == subnet_name]
-            self.assertTrue(
-                len(found_subnet) == 0,
-                "Subnet {0} should have been deleted but still exists."
-                .format(subnet_name))
+            sit.check_delete(self, self.provider.network.subnets, subnet)
 
 
             # Check floating IP address
             # Check floating IP address
             ip = self.provider.network.create_floating_ip()
             ip = self.provider.network.create_floating_ip()
@@ -80,17 +64,12 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
                 "Floating IP {0} should have been deleted but still exists."
                 "Floating IP {0} should have been deleted but still exists."
                 .format(ip_id))
                 .format(ip_id))
 
 
-        netl = self.provider.network.list()
-        found_net = [n for n in netl if n.name == name]
-        self.assertEqual(
-            len(found_net), 0,
-            "Network {0} should have been deleted but still exists."
-            .format(name))
+        sit.check_delete(self, self.provider.network, net)
 
 
     @helpers.skipIfNoService(['network'])
     @helpers.skipIfNoService(['network'])
-    def test_crud_network(self):
-        name = 'cbtestnetwork-{0}'.format(uuid.uuid4())
-        subnet_name = 'cbtestsubnet-{0}'.format(uuid.uuid4())
+    def test_network_properties(self):
+        name = 'cb_propnetwork-{0}'.format(helpers.get_uuid())
+        subnet_name = 'cb_propsubnet-{0}'.format(helpers.get_uuid())
         net = self.provider.network.create(name=name)
         net = self.provider.network.create(name=name)
         with helpers.cleanup_action(
         with helpers.cleanup_action(
             lambda: net.delete()
             lambda: net.delete()
@@ -138,7 +117,7 @@ class CloudNetworkServiceTestCase(ProviderTestBase):
                         router.remove_route(subnet.id)
                         router.remove_route(subnet.id)
                         router.detach_network()
                         router.detach_network()
 
 
-        name = 'cbtestrouter-{0}'.format(uuid.uuid4())
+        name = 'cb_crudrouter-{0}'.format(helpers.get_uuid())
         # Declare these variables and late binding will allow
         # Declare these variables and late binding will allow
         # the cleanup method access to the most current values
         # the cleanup method access to the most current values
         net = None
         net = None

+ 1 - 3
test/test_object_life_cycle.py

@@ -1,5 +1,3 @@
-import uuid
-
 from test import helpers
 from test import helpers
 from test.helpers import ProviderTestBase
 from test.helpers import ProviderTestBase
 
 
@@ -14,7 +12,7 @@ class CloudObjectLifeCycleTestCase(ProviderTestBase):
         """
         """
         Test object life cycle methods by using a volume.
         Test object life cycle methods by using a volume.
         """
         """
-        name = "CBUnitTestLifeCycle-{0}".format(uuid.uuid4())
+        name = "cb_objlifecycle-{0}".format(helpers.get_uuid())
         test_vol = self.provider.block_store.volumes.create(
         test_vol = self.provider.block_store.volumes.create(
             name,
             name,
             1,
             1,

+ 0 - 5
test/test_object_store_service.py

@@ -50,11 +50,6 @@ class CloudObjectStoreServiceTestCase(ProviderTestBase):
             obj_name = obj_name_prefix + "_world.txt"
             obj_name = obj_name_prefix + "_world.txt"
             obj = test_bucket.create_object(obj_name)
             obj = test_bucket.create_object(obj_name)
 
 
-            self.assertTrue(
-                obj.id in repr(obj),
-                "repr(obj) should contain the object id so that the object"
-                " can be reconstructed, but does not. eval(repr(obj)) == obj")
-
             with helpers.cleanup_action(lambda: obj.delete()):
             with helpers.cleanup_action(lambda: obj.delete()):
                 # TODO: This is wrong. We shouldn't have to have a separate
                 # TODO: This is wrong. We shouldn't have to have a separate
                 # call to upload some content before being able to delete
                 # call to upload some content before being able to delete

+ 6 - 7
test/test_security_service.py

@@ -1,6 +1,5 @@
 """Test cloudbridge.security modules."""
 """Test cloudbridge.security modules."""
 import unittest
 import unittest
-import uuid
 
 
 from test import helpers
 from test import helpers
 from test.helpers import ProviderTestBase
 from test.helpers import ProviderTestBase
@@ -13,7 +12,7 @@ class CloudSecurityServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['security.key_pairs'])
     @helpers.skipIfNoService(['security.key_pairs'])
     def test_crud_key_pair_service(self):
     def test_crud_key_pair_service(self):
-        name = 'cbtestkeypairA-{0}'.format(uuid.uuid4())
+        name = 'cb_crudkp-{0}'.format(helpers.get_uuid())
         kp = self.provider.security.key_pairs.create(name=name)
         kp = self.provider.security.key_pairs.create(name=name)
         with helpers.cleanup_action(
         with helpers.cleanup_action(
             lambda:
             lambda:
@@ -30,7 +29,7 @@ class CloudSecurityServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['security.key_pairs'])
     @helpers.skipIfNoService(['security.key_pairs'])
     def test_key_pair_properties(self):
     def test_key_pair_properties(self):
-        name = 'cbtestkeypairB-{0}'.format(uuid.uuid4())
+        name = 'cb_kpprops-{0}'.format(helpers.get_uuid())
         kp = self.provider.security.key_pairs.create(name=name)
         kp = self.provider.security.key_pairs.create(name=name)
         with helpers.cleanup_action(lambda: kp.delete()):
         with helpers.cleanup_action(lambda: kp.delete()):
             self.assertIsNotNone(
             self.assertIsNotNone(
@@ -44,7 +43,7 @@ class CloudSecurityServiceTestCase(ProviderTestBase):
 
 
     @helpers.skipIfNoService(['security.security_groups'])
     @helpers.skipIfNoService(['security.security_groups'])
     def test_crud_security_group_service(self):
     def test_crud_security_group_service(self):
-        name = 'CBTestSecurityGroupA-{0}'.format(uuid.uuid4())
+        name = 'cb_crudsg-{0}'.format(helpers.get_uuid())
 
 
         # Declare these variables and late binding will allow
         # Declare these variables and late binding will allow
         # the cleanup method access to the most current values
         # the cleanup method access to the most current values
@@ -66,7 +65,7 @@ class CloudSecurityServiceTestCase(ProviderTestBase):
     @helpers.skipIfNoService(['security.security_groups'])
     @helpers.skipIfNoService(['security.security_groups'])
     def test_security_group(self):
     def test_security_group(self):
         """Test for proper creation of a security group."""
         """Test for proper creation of a security group."""
-        name = 'CBTestSecurityGroupB-{0}'.format(uuid.uuid4())
+        name = 'cb_propsg-{0}'.format(helpers.get_uuid())
 
 
         # Declare these variables and late binding will allow
         # Declare these variables and late binding will allow
         # the cleanup method access to the most current values
         # the cleanup method access to the most current values
@@ -130,7 +129,7 @@ class CloudSecurityServiceTestCase(ProviderTestBase):
                 "Mock provider returns InvalidParameterValue: "
                 "Mock provider returns InvalidParameterValue: "
                 "Value security_group is invalid for parameter.")
                 "Value security_group is invalid for parameter.")
 
 
-        name = 'CBTestSecurityGroupC-{0}'.format(uuid.uuid4())
+        name = 'cb_sgruletwice-{0}'.format(helpers.get_uuid())
 
 
         # Declare these variables and late binding will allow
         # Declare these variables and late binding will allow
         # the cleanup method access to the most current values
         # the cleanup method access to the most current values
@@ -156,7 +155,7 @@ class CloudSecurityServiceTestCase(ProviderTestBase):
     @helpers.skipIfNoService(['security.security_groups'])
     @helpers.skipIfNoService(['security.security_groups'])
     def test_security_group_group_rule(self):
     def test_security_group_group_rule(self):
         """Test for proper creation of a security group rule."""
         """Test for proper creation of a security group rule."""
-        name = 'CBTestSecurityGroupD-{0}'.format(uuid.uuid4())
+        name = 'cb_sgrule-{0}'.format(helpers.get_uuid())
 
 
         # Declare these variables and late binding will allow
         # Declare these variables and late binding will allow
         # the cleanup method access to the most current values
         # the cleanup method access to the most current values