# -*- mode: ruby -*-
# vi: set ft=ruby :
#
# 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.

Vagrant.configure("2") do |config|
  config.vm.box = "tnarik/solaris10-minimal"

  config.vm.provider "virtualbox" do |v|
    v.memory = 2048
    v.cpus = 2
  end

  config.vm.provision "file", source:"jdk-8u121-solaris-x64.tar.Z", destination:"jdk-8u121-solaris-x64.tar.Z"
  config.vm.provision "file", source:"apache-maven-3.3.9-bin.tar.gz", destination:"apache-maven-3.3.9-bin.tar.gz"
  config.vm.provision "file", source:"apache-maven-3.3.9.patch", destination:"apache-maven-3.3.9.patch"
  config.vm.provision "file", source:"admin", destination:"admin"
  config.vm.provision "shell", inline: <<-SHELL
    sudo pkgadd -d http://get.opencsw.org/now -a/export/home/vagrant/admin CSWpkgutil &&\
    sudo /opt/csw/bin/pkgutil -U &&\
    sudo /opt/csw/bin/pkgutil -y -i git &&\
    zcat jdk-8u121-solaris-x64.tar.Z | tar xf - > /dev/null 2>&1 &&\
    sudo pkgadd -n -a/export/home/vagrant/admin -d . SUNWj8rt SUNWj8dev SUNWj8cfg SUNWj8man > /dev/null 2>&1 &&\
    sudo rm -rf jdk-8u121-solaris-x64.tar.Z SUNWj8cfg SUNWj8dev SUNWj8jmp SUNWj8man SUNWj8rt COPYRIGHT LICENSE README.html THIRDPARTYLICENSEREADME.txt admin > /dev/null 2>&1 &&\
    gunzip -c apache-maven-3.3.9-bin.tar.gz | sudo sh -c "cd /opt; tar xf - " 2>&1 &&\
    sudo patch -i apache-maven-3.3.9.patch /opt/apache-maven-3.3.9/bin/mvn &&\
    sudo ln -s /opt/apache-maven-3.3.9/bin/mvn /usr/bin/mvn &&\
    rm -rf apache-maven-3.3.9-bin.tar.gz apache-maven-3.3.9.patch &&\
    sudo sh -c "echo JAVA_HOME=/usr/jdk/jdk1.8.0_121 >> /etc/profile" &&\
    sudo sh -c "echo export JAVA_HOME >> /etc/profile" &&\
    sudo sh -c "echo MAVEN_HOME=/opt/apache-maven-3.3.9 >> /etc/profile" &&\
    sudo sh -c "echo export MAVEN_HOME >> /etc/profile" &&\
    sudo sh -c "echo PATH=${MAVEN_HOME}/bin:${PATH} >> /etc/profile" &&\
    sudo sh -c "echo export PATH >> /etc/profile"
  SHELL
end
