# File lib/openshift-origin-controller/app/models/application.rb, line 286
  def create
    result_io = ResultIO.new
    gears_created = []
    begin
      self.node_profile = DEFAULT_NODE_PROFILE unless self.node_profile
      elaborate_descriptor
      self.class.notify_observers(:before_application_create, {:application => self, :reply => result_io})
      if self.scalable
        raise OpenShift::UserException.new("Scalable app cannot be of type #{UNSCALABLE_FRAMEWORKS.join(' ')}", "108", result_io) if UNSCALABLE_FRAMEWORKS.include? framework
        min_gear_count = 0
        group_instances.uniq.each { |gi|
          min_gear_count += gi.min
        }
        if ((user.consumed_gears+min_gear_count) > user.max_gears)
          raise OpenShift::UserException.new("#{user.login} has a gear limit of #{user.max_gears} and this app requires #{min_gear_count} gears.", 104)
        end
      end
      user.applications = [] unless user.applications
      user.applications << self
      Rails.logger.debug "Creating gears"
      group_instances.uniq.each do |ginst|
        create_result, new_gear = ginst.add_gear(self)
        result_io.append create_result
      end

      self.gear.name = self.name unless scalable
      self.class.notify_observers(:application_creation_success, {:application => self, :reply => result_io})
    rescue Exception => e
      Rails.logger.debug e.message
      Rails.logger.debug e.backtrace.join("\n")
      Rails.logger.debug "Rolling back application gear creation"
      result_io.append self.destroy
      self.class.notify_observers(:application_creation_failure, {:application => self, :reply => result_io})
      raise
    ensure
      save
    end
    self.class.notify_observers(:after_application_create, {:application => self, :reply => result_io})
    result_io
  end