#
#		 Licensed to the Apache Software Foundation (ASF) under one or more contributor license
#        agreements. See the NOTICE file distributed with this work for additional information
#        regarding copyright ownership. The ASF licenses this file to you 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.
#
# Apache Sling CMS Dockerfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.synced_folder "src", "/vagrant_data"

  config.vm.define "cms", primary: true do |cms|
    cms.vm.network "forwarded_port", guest: 8080, host: 8090
    cms.vm.network "private_network", ip: "10.0.0.2"
    cms.vm.provision "shell", path: "src/install-slingcms.sh"
  end

  config.vm.define "web" do |web|
    web.vm.network "forwarded_port", guest: 80, host: 8085
    web.vm.network "private_network", ip: "10.0.0.3"
    web.vm.provision "shell", path: "src/install-apache.sh"
  end
end