code: def validate_properties(self):
          
          for name, property_type in self.property_types.items():
              value = getattr(self, name)
  
              # If the property value is an intrinsic function, any remaining validation has to be left to CloudFormation
              if property_type.supports_intrinsics and self._is_intrinsic_function(value):
                  continue
  
              # If the property value has not been set, verify that the property is not required.
              if value is None:
                  if property_type.required:
                      raise InvalidResourceException(
                          self.logical_id,
                          "Missing required property '{property_name}'.".format(property_name=name))
              # Otherwise, validate the value of the property.
              elif not property_type.validate(value, should_raise=False):
                  raise InvalidResourceException(
                      self.logical_id,
                      "Type of property '{property_name}' is invalid.".format(property_name=name))
docs: Validates that the required properties for this Resource have been populated, and that all properties have
          valid values.
  
          :returns: True if all properties are valid
          :rtype: bool
          :raises TypeError: if any properties are invalid