# which accompanies this distribution, and is available at
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
-
+import re
 
 from dashboard.exceptions import (
     ResourceExistenceException,
         self.releaseNetworks(grb, vlan_manager, vlans)
         for host in hosts:
             self.releaseHost(host)
+
+
+class HostNameValidator(object):
+    regex = r'^[A-Za-z0-9][A-Za-z0-9-]*$'
+    message = "Hostnames can only contain alphanumeric characters and hyphens (-). Hostnames must start with a letter"
+    pattern = re.compile(regex)
+
+    @classmethod
+    def is_valid_hostname(cls, hostname):
+        return len(hostname) < 65 and cls.pattern.fullmatch(hostname) is not None
 
 from django.contrib.auth.models import User
 
 from resource.inventory_manager import InventoryManager
-from resource.resource_manager import ResourceManager
+from resource.resource_manager import ResourceManager, HostNameValidator
 from account.models import Lab
 from resource.models import (
     Host,
     def test_convert_bundle(self):
         ResourceManager.getInstance().convertResoureBundle(self.genericBundle, self.lab.name)
         # verify bundle configuration
+
+
+class HostNameValidatorTestCase(TestCase):
+
+    def test_valid_hostnames(self):
+        self.assertTrue(HostNameValidator.is_valid_hostname("localhost"))
+        self.assertTrue(HostNameValidator.is_valid_hostname("Localhost"))
+        self.assertTrue(HostNameValidator.is_valid_hostname("localHost"))
+        self.assertTrue(HostNameValidator.is_valid_hostname("LOCALHOST"))
+        self.assertTrue(HostNameValidator.is_valid_hostname("f"))
+        self.assertTrue(HostNameValidator.is_valid_hostname("abc123doreyme"))
+        self.assertTrue(HostNameValidator.is_valid_hostname("F9999999"))
+        self.assertTrue(HostNameValidator.is_valid_hostname("my-host"))
+        self.assertTrue(HostNameValidator.is_valid_hostname("My-Host"))
+        self.assertTrue(HostNameValidator.is_valid_hostname("MY-HOST"))
+        self.assertTrue(HostNameValidator.is_valid_hostname("a-long-name-for-my-host"))
+
+    def test_invalid_hostnames(self):
+        self.assertFalse(HostNameValidator.is_valid_hostname("-long-name-for-my-host"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("546"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"))
+
+    def test_invalid_chars(self):
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains!char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains@char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains#char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains$char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains%char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains^char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains&char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains*char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains(char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains)char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains_char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains=char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains+char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains|char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains\\char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains[char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains]char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains;char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains:char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains'char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname('contains"char'))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains'char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains<char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains>char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains,char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains?char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains/char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains`char"))
+        self.assertFalse(HostNameValidator.is_valid_hostname("contains~char"))